package com.gzc.just.play.last.war.sceneserver.ai;

import com.gzc.just.play.last.war.sceneserver.gameobject.unit.GameUnit;
import java.util.ArrayList;
import java.util.List;

/**
 * 行为树类 - 管理AI的行为逻辑
 * 
 * 映射自C++ BehaviorTree
 * 提供树形结构的行为控制系统
 * 
 * @author AI编程助手
 * @version 1.0
 */
public class BehaviorTree {
    
    private String treeId;
    private BehaviorNode rootNode;
    private GameUnit owner;
    private BehaviorNode.Result lastTickResult = BehaviorNode.Result.FAILURE;
    private long lastTickTime = 0;
    
    /**
     * 构造函数
     * 
     * @param treeId 行为树ID
     * @param owner 行为树所属的游戏单位
     * @param rootNode 根节点
     */
    public BehaviorTree(String treeId, GameUnit owner, BehaviorNode rootNode) {
        this.treeId = treeId;
        this.owner = owner;
        this.rootNode = rootNode;
    }
    
    /**
     * 初始化行为树
     * 
     * @return 是否初始化成功
     */
    public boolean initialize() {
        if (rootNode == null) {
            return false;
        }
        rootNode.initialize(owner);
        lastTickTime = System.currentTimeMillis();
        return true;
    }
    
    /**
     * 更新行为树（心跳处理）
     * 
     * @param currentTime 当前时间毫秒
     * @return 最后的执行结果
     */
    public BehaviorNode.Result tick(long currentTime) {
        if (rootNode == null) {
            return BehaviorNode.Result.FAILURE;
        }
        
        long deltaTime = currentTime - lastTickTime;
        lastTickTime = currentTime;
        
        lastTickResult = rootNode.tick(owner, deltaTime);
        return lastTickResult;
    }
    
    /**
     * 获取行为树ID
     * 
     * @return 行为树ID
     */
    public String getTreeId() {
        return treeId;
    }
    
    /**
     * 获取所属单位
     * 
     * @return 游戏单位
     */
    public GameUnit getOwner() {
        return owner;
    }
    
    /**
     * 获取根节点
     * 
     * @return 根节点
     */
    public BehaviorNode getRootNode() {
        return rootNode;
    }
    
    /**
     * 获取最后的执行结果
     * 
     * @return 执行结果
     */
    public BehaviorNode.Result getLastResult() {
        return lastTickResult;
    }
    
    /**
     * 销毁行为树
     */
    public void destroy() {
        if (rootNode != null) {
            rootNode.terminate(owner);
        }
    }
    
    /**
     * 清空行为树
     */
    public void clear() {
        destroy();
        rootNode = null;
    }
}
